import java.net.*;
import java.util.ArrayList;
import java.io.*;

public class URLConnectionReader {
	private static int nArticoli;
	private static ArrayList<articolo> lista=new ArrayList<articolo>();
	private static String googleSholar="http://scholar.google.com";
	private static ArrayList<String> tipi= new ArrayList<String>();
	private static int nCitazioni=0;

	
	/**
	 * @param autore
	 * @param parola
	 * @param frase
	 * @param max1Parola
	 * @param senzaParola
	 * @param cercaTitolo
	 * @param pubblicazione
	 * @param dataInizio
	 * @param dataFine
	 * @return
	 */
	public static String IndexScholar(String autore, String parola, String frase, String max1Parola, String senzaParola, Boolean cercaTitolo, String pubblicazione, int dataInizio, int dataFine){
		String index="http://scholar.google.com/scholar?as_q=";
		
		if (parola!=null) index=index+parola;
		index=index+"&num=100&btnG=Search+Scholar&as_epq=";
		if (frase!=null) index=index+frase;
		index=index+"&as_oq=";
		if (max1Parola!=null) index=index+max1Parola;
		index=index+"&as_eq=";
		if (senzaParola!=null) index=index+senzaParola;
		index=index+"&as_occt=";
		if (cercaTitolo==false)index=index+"any";
		else index=index+"title";
		index=index+"&as_sauthors=";
		if (autore!=null) index=index+autore;
		index=index+"&as_publication=";
		if (pubblicazione!=null) index=index+pubblicazione;
		index=index+"&as_ylo=";
		if (dataInizio>0) index=index+dataInizio;
		index=index+"&as_yhi=";
		if (dataFine>0) index=index+dataInizio;
		index=index+"&as_sdt=1";

		/*	&as_subj=bio
			&as_subj=med
			&as_subj=bus
			&as_subj=phy
			&as_subj=chm
			&as_subj=soc
			&as_subj=eng */

		index=index+".&as_sdtp=on";
		index=index+"&as_sdtf=&as_sdts=5&hl=en&num=100";
			
		//System.out.println(index);
		return (index);
	}
	
    /**
     * 
     * @param index
     * @return
     * @throws Exception
     */
    public static String HtmlCode(String index ) throws Exception {
    	//System.out.println(index);
    	String temp;
        String HtmlCode=new String();
        URL url = new URL(index);
        
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
        urlConnection.addRequestProperty("User-Agent", "Mozilla/4.76"); 
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                		urlConnection.getInputStream()));
        

        while ((temp = in.readLine()) != null)
        	HtmlCode=HtmlCode+temp;
        in.close();

        return(HtmlCode);
    }
    
    /**
     * @param HtmlCode
     */
    public static void trovaNArticoli(String HtmlCode){
    	String articoli = new String();
    	if (HtmlCode.contains("did not match any articles")==true) articoli="0";
    	else{

            HtmlCode=HtmlCode.replaceAll("\\<html>.*?\\ of about <b>", "");
	    	boolean leggi=true;
	    	int i=0;
	    	do {
	    		char temp = HtmlCode.charAt(i);
	    		//System.out.println(numero[1]);
	    		i++;
	    		if (Character.isDigit(temp)==true)articoli=articoli+temp;
	    		else leggi=false;
	    		} while (leggi==true);
    	}
    	nArticoli=Integer.parseInt(articoli);
    
    }
    
    /**
     * @param htmlCode
     * @throws MalformedURLException 
     */
    public static void decode(String htmlCode) throws MalformedURLException{
    	int p=nArticoli%100;
    	if (p>0)p=1;
    	int m=nArticoli/100+p;
    	String[] pagine = new String[m];
    	pagine[0]=htmlCode;
    	p=0;
    	while (m>1){
    		try {
				pagine[p+1]=HtmlCode(nextURL(pagine[p]));
				System.out.println("ok");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		System.out.println("cilco:"+ p);
    		p++;
    		m=m-1;
    	}
    	for (int i=1; i<pagine.length;i++){
    		pagine[0]=pagine[0]+"\n"+pagine[i];
    	}
    	htmlCode=pagine[0];
    	
    	//HtmlCode=HtmlCode.replaceAll("\\<html>.*?\\ <b>of about", "");
    	htmlCode=htmlCode.replaceAll("\\ <br><a href", "\n<a href");
        htmlCode=htmlCode.replaceAll("\\<div class=gs_r><div class=gs_rt>", "\n");
        htmlCode=htmlCode.replaceAll("\\</font>", "");
        htmlCode=htmlCode.replaceAll("\\</td>", "");
        htmlCode=htmlCode.replaceAll("\\</tr>", "");
        htmlCode=htmlCode.replaceAll("\\</table>", "");
        htmlCode=htmlCode.replaceAll("\\</form>", "");
        htmlCode=htmlCode.replaceAll("\\<p>", "");
        htmlCode=htmlCode.replaceAll("\\<h3>", "");
        htmlCode=htmlCode.replaceAll("\\</h3>", "");
        htmlCode=htmlCode.replaceAll("\\</a>", "");
        htmlCode=htmlCode.replaceAll("\\<b>", "");
        htmlCode=htmlCode.replaceAll("\\</b>", "");
        htmlCode=htmlCode.replaceAll("\\</span><br>", "####");
        htmlCode=htmlCode.replaceAll("\\<br>", "");
        htmlCode=htmlCode.replaceAll("\\</br>", "");
        htmlCode=htmlCode.replaceAll("\\</span>", "");
        htmlCode=htmlCode.replaceAll("\\</div>", "");
        htmlCode=htmlCode.replaceAll("&#39;", "'");
        htmlCode=htmlCode.replaceAll("&hellip;", "...");
        //salvaFile(htmlCode);
        String[] paragraf=htmlCode.split("\n");
        //System.out.println(paragraf.length);
        
        int i=0,k=0;
        htmlCode="";
        while (i<(paragraf.length-1)){
        	if(paragraf[i].contains("<html><head>")==false&&paragraf[i].contains("<td nowrap><a href=")==false){
        		lista.add(new articolo());
        		if (paragraf[i].contains("<span class=gs_ctu>")==true){
        			paragraf[i]=paragraf[i].replaceAll("\\<span class=gs_ctu>", "");
        			paragraf[i]=paragraf[i].substring(11);
        			//System.out.println(paragraf[i]);
        			checkTipo("CITAZIONE");
        			lista.get(k).setTipo("CITAZIONE");
        			//System.out.println("paragraf["+i+"] "+paragraf[i]);
        			riempiLista(k, paragraf[i]);
        			
        		}
        		else{
        			if (paragraf[i].contains("<span class=gs_ctc>")==true){
	        			paragraf[i]=paragraf[i].replaceAll("\\<span class=gs_ctc>", "");
	        			boolean leggi=true;
	        			String type="";
	        	    	int c=1;
	        	    	do {
	        	    		char temp = paragraf[i].charAt(c);
	        	    		c++;
	        	    		if (Character.isAlphabetic(temp)==true)type=type+temp;
	        	    		else {
	        	    			leggi=false;
	        	    			checkTipo(type);
	        	    			paragraf[i]=paragraf[i].substring(c+1);
	        	    			lista.get(k).setTipo(type);
	        	    		}
	        	    	} while (leggi==true);
	        		}
        			else {
        				checkTipo("GENERICO");
        				lista.get(k).setTipo("GENERICO");
        			}
        			riempiLista(k, paragraf[i]);
        			
        		}
        		htmlCode=htmlCode+"\n"+paragraf[i];
        		k++;
        	}
        	i++;
        	
    	}
        salvaFile(htmlCode);
        
	    	
    }
    
    /**
     * @param index
     * @param toSplit
     * @throws MalformedURLException
     */
    private static void riempiLista(int index, String toSplit) throws MalformedURLException{
    	String[] temp=toSplit.split("<font size=-1><span class=gs_a>");
    	//System.out.println(lista.get(index).getTipo() + " "+temp[0]);
    	if (lista.get(index).getTipo()=="CITAZIONE")lista.get(index).setTitolo(temp[0], null);
    	else{
    		if (temp[0].contains("gs_ggs gs_fl")==true){
    			String[] temp1=temp[0].split("gs_ggs gs_fl");
    			String nome=temp1[0].replaceAll("\\<.*?>","");
    			nome=nome.substring(0, nome.length()-13);
    			lista.get(index).setTitolo(nome, stringToUrlConverter(estraiURL(temp1[0])));
    			temp1=temp1[1].split("<span class=gs_ctg2>");
    			lista.get(index).setPDF(temp1[1], stringToUrlConverter(estraiURL(temp1[0].substring(2))));
   
    		}
    		else{
    			lista.get(index).setTitolo(temp[0].replaceAll("\\<.*?>",""), stringToUrlConverter(estraiURL(temp[0])));
    		}
    	}
    	//System.out.println(index+"" +lista.get(index).getTipo()+" "+lista.get(index).getNomeTitolo()+" "+lista.get(index).getUrlTitolo()+" "+lista.get(index).getNomePDF()+" "+lista.get(index).getUrlPDF());
    	if (lista.get(index).getTipo()=="CITAZIONE"){
    		//System.out.println(temp[1]);
    		temp[1]=temp[1].replaceAll("####","");
    		//System.out.println(temp[1]);
    	}
    	int y=1;
		if (temp[1].contains("<span class=gs_fl>")==true) {
			temp=temp[1].split("<span class=gs_fl>");
			y=0;
		}
		//System.out.println(temp[y]);
		if (temp[y].contains(" - ")==true){
			String[] temp2;
			if (temp[y].contains("####")==true){
				temp2=temp[y].split("####");
				//System.out.println("##"+temp[y]);
				if (temp2.length>1)lista.get(index).setRiassunto(temp2[1]);
				temp[y]=temp2[0];
			}
			temp2=temp[y].split(" - ");
			lista.get(index).setAutori(temp2[0]);
				boolean leggi=true;
				//System.out.println("k= "+k);
				//System.out.println("k= "+k+" "+temp2[1]);
		    	int l=temp2[1].length()-1;
		    	String anno="";
		    	//System.out.println("## "+i);
		    	while (leggi==true){
		    		//System.out.println("ciclo do l= "+l);
		    		//System.out.println("#"+temp2[1]);
		    		char ch = temp2[1].charAt(l);
		    		
		    		if (Character.isDigit(ch)==true){
		    			anno=ch+anno;
		    			if (l==0){
		    				lista.get(index).setAnno(Integer.parseInt(anno));
		    				leggi=false;
		    			}
		    			//System.out.println(anno+" l="+l);
		    		}
		    		else if (ch==' ');
		    		else if (ch==','&& anno!=""){
		    				leggi=false;
		    				lista.get(index).setAnno(Integer.parseInt(anno));
		    				temp2[1]=temp2[1].substring(0, l);
		    				//System.out.println("####"+temp2[1]);
		    				lista.get(index).setPubblicazione(temp2[1]);
		    			}
		    		else {
		    			leggi=false;
		    			lista.get(index).setPubblicazione(temp2[1]);
		    		}
		    		l--;
		    		} 
		    		if (temp2.length==3||(lista.get(index).getAnno()==0 && lista.get(index).getPubblicazione()==null)) {
		    			if (temp2[temp2.length-1].contains("...")==true)lista.get(index).setPubblicazione(temp2[temp2.length-1]);
		    			else lista.get(index).setEditore(temp2[temp2.length-1]);
		    		}
		    		//System.out.println("Titolo: "+lista.get(k).getNomeTitolo()+" Autori: "+ lista.get(k).getAutori()+" Pubblicazione: "+lista.get(k).getPubblicazione()+ " Anno: "+lista.get(k).getAnno()+ " Editore: "+lista.get(k).getEditore());
		    		
		}
		else lista.get(index).setAutori(temp[y]);
		if (y==0){
			//System.out.println(temp[1]);
			if (temp[1].contains(" - ")==true){
				String[] temp2=(temp[1].split(" - "));
				for (int size=0; size<temp2.length;size++){
					while (temp2[size].charAt(temp2[size].length()-1)==' '){
						temp2[size]=temp2[size].substring(0, temp2[size].length()-2);
			    	}
					if (temp2[size].contains("Cited by")==true){
						String[] temp3=temp2[size].split("Cited by ");
						int num=Integer.parseInt(temp3[1]);
						nCitazioni=nCitazioni+num;
						lista.get(index).setCitazioni(num, stringToUrlConverter(estraiURL(temp2[size])));
						//System.out.println("Citazioni:"+lista.get(index).getNumeroCitazioni()+" URL: "+lista.get(index).getUrlCitazioni());
					}
					else if (temp2[size].contains("Related articles")==true){
						//System.out.println("Articoli correlati link: "+"'"+estraiURL(temp2[size])+"'");
						lista.get(index).setArticoliCorrelati(stringToUrlConverter(estraiURL(temp2[size])));
					}
					else if (temp2[size].contains("versions")==true){
						String url=estraiURL(temp2[size]);
						temp2[size]=temp2[size].substring(0, temp2[size].length()-9);
						boolean leggi=true;
						int num=temp2[size].length()-1;
						String versioni="";
						while (leggi==true){
				    		char ch = temp2[size].charAt(num);
				    		num--;
				    		if (Character.isDigit(ch)==true){
				    			versioni=ch+versioni;
				    		}
				    		else{
			    				leggi=false;
			    				num=Integer.parseInt(versioni);
				    		}
						}
						lista.get(index).setVersioni(num, stringToUrlConverter(url));
						//System.out.println("Versioni:" +lista.get(index).getNumeroVersioni()+" URL: "+lista.get(index).getUrlVersioni());
					}
					else{
						String nome = temp2[size].replaceAll("\\<.*?>","");
						lista.get(index).addLinkExtra(nome, stringToUrlConverter(estraiURL(temp2[size])));
					}
				}
				}else {
					while (temp[1].charAt(temp[1].length()-1)==' '){
						temp[1]=temp[1].substring(0, temp[1].length()-2);
			    	}
					if (temp[1].contains("Cited by")==true){
						String[] temp3=temp[1].split("Cited by ");
						int num=Integer.parseInt(temp3[1]);
						nCitazioni=nCitazioni+num;
						lista.get(index).setCitazioni(num, stringToUrlConverter(estraiURL(temp[1])));
					}
					else if (temp[1].contains("Related articles")==true){
						lista.get(index).setArticoliCorrelati(stringToUrlConverter(estraiURL(temp[1])));
					}
					else if (temp[1].contains("versions")==true){
						String url=estraiURL(temp[1]);
						temp[1]=temp[1].substring(0, temp[1].length()-9);
						boolean leggi=true;
						int num=temp[1].length()-1;
						String versioni="";
						while (leggi==true){
				    		char ch = temp[1].charAt(num);
				    		num--;
				    		if (Character.isDigit(ch)==true){
				    			versioni=ch+versioni;
				    		}
				    		else{
			    				leggi=false;
			    				
			    				num=Integer.parseInt(versioni);
				    		} 
						}
						lista.get(index).setVersioni(num, stringToUrlConverter(url));
						//System.out.println("Versioni2:" +lista.get(index).getNumeroVersioni()+" URL: "+lista.get(index).getUrlVersioni());
					}
					else{
						String nome = temp[1].replaceAll("\\<.*?>","");
						lista.get(index).addLinkExtra(nome, stringToUrlConverter(estraiURL(temp[1])));
					}
				}
			
		}
    	
    }
    
    /**
     * 
     */
    public static void creaPaginaHTML(){
    	String titolopagina="Lista";
    	String stringa="<!DOCTYPE html><head><title>"+titolopagina+"</title></head><body><header><hgroup><h1>Scholarometer</a></h1><h2>Risultati ricerca "+titolopagina+"</h2><h4>Numero articoli: "+nArticoli+" Numero citazioni: "+nCitazioni+"</hgroup></header><div>";
    	if (lista.size()>0){
    	 	for (int i=0;i<lista.size();i++){
        		stringa=stringa+"<article>";
        		//TITOLO
        		stringa=stringa+"<h2>";
        		if (lista.get(i).getUrlTitolo()!=null)stringa=stringa+HTMLUrl(lista.get(i).getUrlTitolo());
        		if (lista.get(i).getTipo()!="GENERICO")stringa=stringa+"["+lista.get(i).getTipo()+"]";
        		stringa=stringa+lista.get(i).getNomeTitolo()+"</a></h2>";
        		//PDF
        		if (lista.get(i).getNomePDF()!=null)stringa=stringa+"<h5>"+HTMLUrl(lista.get(i).getUrlPDF())+lista.get(i).getNomePDF()+"</a></h5>";
        		//INFO AUTORI, PUBBLICAZIONE, ANNO, EDITORE
        		stringa=stringa+"Autori: "+lista.get(i).getAutori()+" - Pubblicazione: ";
        		if (lista.get(i).getPubblicazione()==null) stringa=stringa+"n.d. - Anno: ";
        		else stringa=stringa+lista.get(i).getPubblicazione()+" - Anno: ";
        		if (lista.get(i).getAnno()==0) stringa=stringa+"n.d. - Editore: ";
        		else stringa=stringa+lista.get(i).getAnno()+" - Editore: ";
        		if (lista.get(i).getEditore()==null) stringa=stringa+"n.d.";
        		else stringa=stringa+lista.get(i).getEditore();
        		//TESTO
        		if (lista.get(i).getRiassunto()!=null)stringa=stringa+"<h4>"+lista.get(i).getRiassunto()+"</h4>";
        		else stringa=stringa+"<br/>";
        		//CITAZIONI, ARTICOLI CORRELATI, LINK ETRA, VERSIONI
        		
        		if (lista.get(i).getNumeroCitazioni()!=0)stringa=stringa+HTMLUrl(lista.get(i).getUrlCitazioni())+"Citazioni: "+lista.get(i).getNumeroCitazioni()+"</a>";
        		else stringa=stringa+"Citazioni: 0";
        		if (lista.get(i).getArticoliCorrelati()!=null) stringa=stringa+" - "+HTMLUrl(lista.get(i).getArticoliCorrelati())+"Articoli correlati</a>";
        		if (lista.get(i).sizeLinkExtra()!=0){
        			for (int n=0;n<lista.get(i).sizeLinkExtra();n++){
        				stringa=stringa+" - "+HTMLUrl(lista.get(i).getUrlLinkExtra(n))+lista.get(i).getNomeLinkExtra(n)+"</a>";
        			}
        		}
        		if (lista.get(i).getNumeroVersioni()!=0) stringa=stringa+" - "+HTMLUrl(lista.get(i).getUrlVersioni())+"Versioni: "+lista.get(i).getNumeroVersioni()+"</a>";
        		stringa=stringa+"<hr />";
        	}
    	}
    	else stringa=stringa+"Spiacenti, nessun risultato";
   
    	stringa=stringa+"</div></body></html>";
    	PrintWriter lista = null;
		try {
			lista = new PrintWriter ("lista.html");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	 lista.println (stringa);
    	 lista.close ();
    	 System.out.println("salvataggio HTML avvenuto");
    }
    
    /**
     * @param url
     * @return
     */
    private static String HTMLUrl(URL url){
    	char speciale='"';
    	String html="<a href="+speciale+url+speciale+">";
		return html;
    	
    }
    
    /**
     * @param articolo
     * @return
     */
    public static String estraiURL(String articolo){
    	while (articolo.charAt(0)==' '){
    		articolo=articolo.substring(1);
    	}
    	articolo=articolo.substring(9);
    	String url="";
    	boolean leggi=true;
    	int i=0;
    	do {
    		char temp = articolo.charAt(i);
    		i++;
    		if (temp!='"')url=url+temp;
    		else leggi=false;
    		} while (leggi==true);
    	if (articolo.charAt(0)=='/') url=googleSholar+url;
		return url;
    	
    }
    /**
     * @param tipo
     */
    public static void checkTipo(String tipo){
		if (tipi.size()==0) tipi.add(tipo);
		else{
			boolean find=false;
			for (int j=0; j<tipi.size();j++){
				if (tipi.get(j).equalsIgnoreCase(tipo)==true) find=true;
			}
			if (find==false) tipi.add(tipo);
		}
    }
    
    /**
     * @param stringa
     */
    public static void salvaFile(String stringa){
    	PrintWriter lista = null;
		try {
			lista = new PrintWriter ("list.txt");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	 lista.println (stringa);
    	 lista.close ();
    	 System.out.println("salvataggio avvenuto");
    }
    
    /**
     * @param urlNext
     * @return
     */
    public static String nextURL(String urlNext){
    	String[] temp=urlNext.split("<td nowrap><a href=");
    	boolean leggi=true;
    	int i=0;
    	temp[0]="";
    	do {
    		char ch = temp[1].charAt(i);
    		i++;
    		if (ch=='"');
    		else if(ch=='>') leggi=false;
    		else temp[0]=temp[0]+ch;
    		} while (leggi==true);
    	temp[0]=temp[0].replaceAll("amp;oe=ASCII&amp;", "");
    	temp[0]=temp[0].replaceAll("amp;", "");
    	temp[0]=googleSholar+temp[0];
    	return(temp[0]);
    }
    
    /**
     * @param urlString
     * @return
     */
    public static URL stringToUrlConverter(String urlString){
    	URL url = null;
		try {
			url = new URL(urlString);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	return url;
    }
    
    public static void main(String[] args) throws Exception {

    	
		String prova=HtmlCode(IndexScholar("luciano+baresi",null, null, null, null, false, null, 0, 0));

    	trovaNArticoli(prova);
    	System.out.println("nArticoli= "+nArticoli);
    	System.out.println(tipi.size());

    	
    	if (nArticoli>0) decode(prova);
    	for (int j=0; j<tipi.size();j++){
			System.out.println(tipi.get(j));
			//System.out.println(lista.get(0).getTitolo().getNome());
			//System.out.println(lista.get(0).getTitolo().getLink());
		}
    	for (int j=0; j<lista.size();j++){
			if (lista.get(j).getNomeTitolo()!=null)System.out.println(lista.get(j).getTipo()+" "+lista.get(j).getNomeTitolo()+" Autori: "+lista.get(j).getAutori()+" Pubblicazione: "+lista.get(j).getPubblicazione()+" Anno: "+lista.get(j).getAnno()+" Editore: "+lista.get(j).getEditore());
		}
    	
    	System.out.println("Citazioni= "+nCitazioni);
    	creaPaginaHTML();
    	
    	/*
    	hTLink htLink=new hTLink("Titolo", stringToUrlConverter("http://www.springerlink.com/index/yn1417vr847x7j0x.pdf"));
        htLink.setHTLink("Titolo", stringToUrlConverter("http://www.springerlink.com/index/yn1417vr847x7j0x.pdf"));
        System.out.println(htLink.getNome());
        System.out.println(htLink.getLink());
        /*
        articolo article =new articolo();
        htLink.setHTLink("Titolo", null);
        article.setTitolo("Titolo articolo", null);
       numHTLink nHTLinl;
      	htLink.setLink("http://www.springerlink.com/index/yn1417vr847x7j0x.pdf");
        htLink.setNome("Titolo");
        article.setTitolo(htLink);
        lista.add(article);
        System.out.println(htLink.getNome());
        System.out.println(htLink.getLink());
        System.out.println(article.getNomeTitolo());
        System.out.println(article.getUrlTitolo());*/
    }
}